package jp.co.baka.pachinko.controller.regist;

import java.util.Date;
import java.util.UUID;

import jp.co.baka.pachinko.costant.SecretKeys;
import jp.co.baka.pachinko.meta.UserMstMeta;
import jp.co.baka.pachinko.model.UserMst;
import jp.co.baka.pachinko.service.MailService;
import jp.co.baka.pachinko.util.Crypt;
import jp.co.baka.pachinko.util.LogicalErrors;
import jp.co.baka.pachinko.util.MyContrller;

import org.slim3.controller.Navigation;
import org.slim3.controller.validator.Validators;
import org.slim3.datastore.Datastore;
import org.slim3.util.BeanUtil;



/**
 *
 * ユーザ登録
 *
 * @author takemura
 *
 */
public class RegistController extends MyContrller {



    @Override
    public Navigation run() throws Exception {

        if(!validate()){
            return forward("regist.jsp");
        }

        UserMst user = new UserMst();
        BeanUtil.copy(request, user);

        regist(user);

        if(LogicalErrors.hasErrors()){
            return forward("regist.jsp");
        }


        return forward("regist_confirm_mail.jsp");
    }


    protected boolean validate() {
        Validators v = new Validators(request);
        v.add("userName", v.required("なまえを入力してください"));
        v.add("mailAddr",
            v.required("メール入力してください"),
            v.regexp(".+@.+\\..+","メールアドレスの書式が正しくありません"));

        return v.validate();

    }

    public  void regist(UserMst user){

        UserMstMeta u = UserMstMeta.get();

        //ユーザ名重複チェック
        UserMst record = Datastore.query(u).filter(u.userName.equal(user.getUserName())).asSingle();
        if(record!=null){
            LogicalErrors.addErrMessage("なまえが既に使われています。");
            return;

        }

        //既に登録されていないかチェック
        String cryptedMail = Crypt.encrypt(SecretKeys.CRYPT_KEY,user.getMailAddr());
        record = Datastore.query(u).filter(u.cryptMailAddr.equal(cryptedMail)).asSingle();

        if(record == null){
            //新規登録
            String uuid = UUID.randomUUID().toString();
            user.setUuid(uuid);
            user.setCryptMailAddr(cryptedMail);
            user.setInsertDate(new Date());

            Datastore.put(user);
            sendMail(user.getMailAddr(),uuid);

        }else{
            //メールあり時
            if(record.getRegistDate()!=null){
                LogicalErrors.addErrMessage("既に登録済みのメールアドレスです");
                return;
            }else{
                //未登録で登録依頼が来た場合はUUIDを振り直す
                String uuid = UUID.randomUUID().toString();
                record.setUuid(uuid);
                record.setUserName(user.getUserName());

                Datastore.put(record);
                sendMail(user.getMailAddr(),uuid);
            }

        }

    }

    /*
     * 登録確認用メール送信
     */
    private  void sendMail(String mail,String uuid){


        String subject = "パチンコ管理　登録確認";

        StringBuffer body = new StringBuffer();

        body.append("パチンコ管理　登録確認\n\n")
        .append("登録を完了する為に下記のページにアクセスしてください\n")
        .append("http://dev1.pach38.appspot.com/log/registConfirm?uuid=" + uuid)
        .append("\n\n\n");

        MailService.sendMail(mail, subject, body.toString());

    }
}
